﻿using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.DataAccess.SqlServer.Model;
using MIAP.Entidades;
using MIAP.Entidades.Enums;

namespace MIAP.DataAccess.Implementaciones.SQL
{
    /// <summary>
    /// Clase para el acceso a datos para la vista Consulta Cargas y Ejecución de Proyectos.
    /// </summary>
    public class ConsultaEjecucionProyectoDao : IConsultaEjecucionProyectoDao
    {
        private IList<UsuarioInfo> GetUsuarios()
        {
            UsuarioDao usuarioDao = new UsuarioDao();
            return usuarioDao.GetUsuarios();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="consultaEjecucion"></param>
        /// <returns></returns>
        public IList<ConsultaEjecucionProyectoInfo> GetEjecucionProyectosByPeriodo(ConsultaEjecucionProyectoInfo consultaEjecucion)
        {
            IList<UsuarioInfo> usuarios = null;

            IList<ConsultaEjecucionProyectoInfo> listProyectosEjecutados;

            // Obtiene la lista de usuarios
            usuarios = GetUsuarios();

            //int añoPeriodoAnterior = año;
            //int mesPeriodoAnterior = mes - 1;

            //// Se calcula el año para el periodo anterior
            //if ((Meses)mes == Meses.Enero)
            //{
            //    añoPeriodoAnterior = año -1;
            //}

            using (var context = new MIAPDBEntities())
            {
                // Obtiene los proyectos ejecutados de acuerdo a los filtros.
                var query = (from bitacoraGeneral in context.MIAP_BITACORA_GENERAL
                             join bitacoraProyecto in context.MIAP_BITACORA_PROYECTO
                             on bitacoraGeneral.ID_BITACORA_GENERAL equals bitacoraProyecto.ID_BITACORA_GENERAL
                             join proyecto in context.MIAP_PROYECTO
                             on bitacoraProyecto.ID_PROYECTO equals proyecto.ID_PROYECTO
                             join periodoInformacion in context.MIAP_PERIODO_INFORMACION
                             on proyecto.ID_PERIODO_INFORMACION equals periodoInformacion.ID_PERIODO_INFORMACION
                             join periodoCarga in context.MIAP_PERIODO_CARGA
                             on proyecto.ID_PERIODO_CARGA equals periodoCarga.ID_PERIODO_CARGA
                             where //(!consultaEjecucion.Año.HasValue || bitacoraGeneral.AÑO == consultaEjecucion.Año)
                             //&& (!consultaEjecucion.Mes.HasValue || bitacoraGeneral.MES == consultaEjecucion.Mes)
                             //&&
                             (bitacoraGeneral.ID_TIPO_PROCESO == (int)TipoProceso.Ejecucion && proyecto.ACTIVO == true)
                             select new ConsultaEjecucionProyectoInfo()
                             {
                                 IdProyecto = bitacoraProyecto.ID_PROYECTO,
                                 IdEjecutante = bitacoraGeneral.ID_USUARIO,
                                 NombreProyecto = proyecto.NOMBRE,
                                 PeriodoInformacion = periodoInformacion.NOMBRE,
                                 PeriodoCarga = periodoCarga.NOMBRE,
                                 InicioEjecucion = bitacoraProyecto.INICIO_PROCESO,
                                 FinEjecución = bitacoraProyecto.FIN_PROCESO,
                                 Estatus = (from bitacoraGeneralEstatus in context.MIAP_BITACORA_GENERAL
                                           join bitacoraProyectoEstatus in context.MIAP_BITACORA_PROYECTO
                                           on bitacoraGeneralEstatus.ID_BITACORA_GENERAL equals bitacoraProyectoEstatus.ID_BITACORA_GENERAL
                                            join bitacoraEstatusProc in context.MIAP_ESTATUS_PROCESO
                                            on bitacoraGeneralEstatus.ID_ESTATUS_PROCESO equals bitacoraEstatusProc.ID_ESTATUS_PROCESO 
                                           where(bitacoraGeneralEstatus.ID_TIPO_PROCESO == (int)TipoProceso.Ejecucion
                                           && (!consultaEjecucion.Año.HasValue || bitacoraGeneralEstatus.AÑO == consultaEjecucion.Año)
                                           && (!consultaEjecucion.Mes.HasValue || bitacoraGeneralEstatus.MES == consultaEjecucion.Mes)
                                           &&( bitacoraGeneralEstatus.ID_BITACORA_GENERAL == bitacoraGeneral.ID_BITACORA_GENERAL))
                                            select bitacoraEstatusProc.NOMBRE).FirstOrDefault() ?? "No ejecutado",
                                 IdEstatus = (from bitacoraGeneralEstatus in context.MIAP_BITACORA_GENERAL
                                            join bitacoraProyectoEstatus in context.MIAP_BITACORA_PROYECTO
                                            on bitacoraGeneralEstatus.ID_BITACORA_GENERAL equals bitacoraProyectoEstatus.ID_BITACORA_GENERAL
                                            join bitacoraEstatusProc in context.MIAP_ESTATUS_PROCESO
                                            on bitacoraGeneralEstatus.ID_ESTATUS_PROCESO equals bitacoraEstatusProc.ID_ESTATUS_PROCESO
                                            where (bitacoraGeneralEstatus.ID_TIPO_PROCESO == (int)TipoProceso.Ejecucion
                                            && (!consultaEjecucion.Año.HasValue || bitacoraGeneralEstatus.AÑO == consultaEjecucion.Año)
                                            && (!consultaEjecucion.Mes.HasValue || bitacoraGeneralEstatus.MES == consultaEjecucion.Mes)
                                            && (bitacoraGeneralEstatus.ID_BITACORA_GENERAL == bitacoraGeneral.ID_BITACORA_GENERAL))
                                            select bitacoraEstatusProc.ID_ESTATUS_PROCESO).FirstOrDefault() , 
                                 Mes = consultaEjecucion.Mes,
                                 Año = consultaEjecucion.Año
                             }).ToList();

                listProyectosEjecutados = query.ToList();
            }

            foreach (ConsultaEjecucionProyectoInfo proyectoEjecutado in listProyectosEjecutados)
            {
                UsuarioInfo usuario = usuarios.Where(p => p.IdUsuario == proyectoEjecutado.IdEjecutante).Single();

                proyectoEjecutado.Ejecutante = usuario.NombreCompleto;
            }

            return listProyectosEjecutados;
        }
    }
}